package com.triple.triplerpc.server.tcp;

import com.triple.triplerpc.protocol.ProtocolConstant;
import io.vertx.core.Handler;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.parsetools.RecordParser;

/**
 * 装饰者模式（使用 recordParser 对原有的 buffer 处理能力进行增强）
 */
public class TcpBufferHandlerWrapper implements Handler<Buffer> {

    private final RecordParser recordParser;

    public TcpBufferHandlerWrapper(Handler<Buffer> bufferHandler) {
        recordParser = initRecordParser(bufferHandler);
    }

    @Override
    public void handle(Buffer buffer) {
        // 这里的handle调用的parser的handle, 也就是本类下面写的handle
        recordParser.handle(buffer);
    }

    private RecordParser initRecordParser(Handler<Buffer> bufferHandler) {
        // 构造 parser, 初始化为请求头的17个字节
        RecordParser parser = RecordParser.newFixed(ProtocolConstant.MESSAGE_HEADER_LENGTH);

        parser.setOutput(new Handler<>() {
            // 初始化
            int size = -1;
            // 新建存储结果的buffer
            Buffer resultBuffer = Buffer.buffer();
            @Override
            public void handle(Buffer buffer) {
                // 会不断调用handle直到当前发送过来的消息处理完毕
                if (size == -1) {
                    // 读取消息体长度, 并设置给parser
                    size = buffer.getInt(13);
                    parser.fixedSizeMode(size);
                    // 写入头信息到结果
                    resultBuffer.appendBuffer(buffer);
                } else {
                    // 写入体信息到结果
                    resultBuffer.appendBuffer(buffer);
                    // 已拼接为完整 Buffer, 执行处理, 交给encoder或decoder
                    // 这里调用的是new TcpBufferHandlerWrapper时指定的handle方法, 每个new的地方可以自定义
                    bufferHandler.handle(resultBuffer);
                    // 重置一轮, 新一轮依旧先读请求头的17个字节
                    parser.fixedSizeMode(ProtocolConstant.MESSAGE_HEADER_LENGTH);
                    size = -1;
                    resultBuffer = Buffer.buffer();
                }
            }
        });

        return parser;
    }

}
